package com.entity

import picocli.CommandLine.Command
import picocli.CommandLine.Option
import picocli.CommandLine.Parameters
import java.util.concurrent.Callable

/**
 * 文档
 * https://picocli.info/#_add_as_external_dependency
 */
@Command(
    name = "push",
    header = ["Version 2.0"],
    requiredOptionMarker = '*',
    abbreviateSynopsis = true,
    sortOptions = false
)
class PackCmd(
    private val callable: (() -> Unit)?
) : Callable<Int?> {

    /**
     * 显示帮助信息并退出程序
     * 通过 -help 参数触发
     */
    @Option(names = ["-h", "-help"], usageHelp = true, description = ["显示帮助并退出"])
    var help: Boolean = false

    /**
     * 清理 CloudFront 缓存
     * 通过 -cls 或 -clear 参数启用
     */
    @Option(names = ["-cls", "-clear"], description = ["清理 CloudFront 缓存"])
    var clear: Boolean = false

    /**
     * 语言工具配置
     * 通过 -lang 或 -languages 参数指定语言配置文件路径
     */
    @Option(names = ["-lang", "-languages"], description = ["语言工具"])
    var languagesConfig: PackPath? = null

    /**
     * XML 转换为 TS 文件
     * 通过 -toTs 参数启用
     */
    @Option(names = ["-toTs"], description = ["xml转换ts"])
    var toTs: Boolean = false

    /**
     * 是否压缩不一致的资源文件
     * 通过 -zip 参数启用
     */
    @Option(names = ["-zip"], description = ["是否压缩不一样的资源"])
    var isZip: Boolean = false

    /**
     * Excel 转换为 XML 文件
     * 通过 -toXml 参数启用
     */
    @JvmField
    @Option(names = ["-toXml"], description = ["excel转换xml"])
    var toXml: Boolean = false

    /**
     * Excel 转换为 XML 时，指定单独转换的列索引
     * 通过 -toXmlCol 参数指定列号
     */
    @JvmField
    @Option(names = ["-toXmlCol"], description = ["excel转换xml，指定单独转换的列"])
    var toXmlCol: Int = 0

    /**
     * XML 转换为 Excel 文件
     * 通过 -toXls 或 -toExcel 参数启用
     */
    @JvmField
    @Option(names = ["-toXls", "-toExcel"], description = ["xml转换excel"])
    var toExcel: Boolean = false

    /**
     * 环境和上传配置文件参数列表
     * 命令行位置参数，默认值为"环境、上传配置文件"
     */
    @Parameters(defaultValue = "环境、上传配置文件")
    var stringList: List<String>? = null

    override fun call(): Int? {
        callable?.invoke()
        return null
    }

}
